home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Graphics / sKulpt / skulpt-src / Winstuff.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-22  |  11.7 KB  |  401 lines

  1. #define STRICT
  2.  
  3. // Includes standard Windows
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <stdio.h>
  11.  
  12. #ifdef _AMIGA_
  13. #include    <stdarg.h>
  14. #endif
  15.  
  16. // Includes D3D
  17. #define  D3D_OVERLOADS
  18. #include <ddraw.h>
  19. #include <d3d.h>
  20. #include <d3dx.h>
  21.  
  22. // Includes utilitaires D3D
  23. #include "d3dmath.h"
  24. #include "d3dutil.h"
  25. #include "D3DEnum.h"
  26.  
  27. // Ids Resources
  28. #include "resource.h"
  29.  
  30. // Constantes
  31. #include "const.h"
  32.  
  33. // Types
  34. #include "types.h"
  35.  
  36. // Variables globales projet
  37. #include "vars.h"
  38.  
  39. // Prototypes fonctions autres modules
  40. #include "proto.h"
  41.  
  42. // Macros
  43. #include "macros.h"
  44.  
  45. /*
  46. int APIENTRY WinMain(HINSTANCE hInstance,
  47.                      HINSTANCE hPrevInstance,
  48.                      LPSTR     lCmdLine,
  49.                      int       iShowMode)
  50. {
  51.     MSG hMessage;
  52.     WNDCLASS  wcPersp, wcPlanar, wcMenu;
  53.     RECT rRectangle;
  54.     HDC hdcScreen = GetDC(NULL);
  55.  
  56.     int iScreenWidth = GetDeviceCaps(hdcScreen, HORZRES),
  57.         iScreenHeight = GetDeviceCaps(hdcScreen, VERTRES);
  58.  
  59.     ReleaseDC(NULL, hdcScreen);
  60.  
  61. #ifndef NO3D
  62.     HRESULT hResult;
  63. #endif
  64.  
  65.     // Ne pas se lancer si l'appli tourne déjà
  66.     if (hPrevInstance) return(FALSE);
  67.     
  68.     // Stocker le pointeur d'instance courante
  69.     hInst = hInstance;
  70.     
  71.     // Initialiser le générateur aléatoire
  72.     srand( (unsigned)time( NULL ) );
  73.  
  74.     // Initialiser les tableaux d'objets 3D
  75.     vDeleteObjects();
  76.  
  77.     // Créer les gadgets sculpt 3D
  78.     vPrepareGadgets();
  79.  
  80.     // Enregistrer la classe de fenêtre menu / trace
  81.     wcMenu.style         = CS_HREDRAW | CS_VREDRAW;
  82.     wcMenu.lpfnWndProc   = (WNDPROC) lrMenuWndProc;
  83.     wcMenu.cbClsExtra    = 0;
  84.     wcMenu.cbWndExtra    = 0;
  85.     wcMenu.hInstance     = hInstance;
  86.     wcMenu.hIcon         = NULL;
  87.     wcMenu.hCursor       = LoadCursor(NULL, IDC_ARROW);
  88.     wcMenu.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  89.     wcMenu.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU);
  90.     wcMenu.lpszClassName = sMenu;
  91.     RegisterClass(&wcMenu);
  92.  
  93.     // Créer la fenêtre menu / trace
  94.     hWndMenu = CreateWindow(sMenu, NULL, WS_OVERLAPPEDWINDOW,
  95.               0, 0, iScreenWidth, iScreenHeight / 9,
  96.               NULL, NULL, hInstance, NULL);
  97.     if (!hWndMenu) return (FALSE);
  98.  
  99.     // Ajouter la listbox à la fenêtre menu / trace
  100.     GetClientRect(hWndMenu, &rRectangle);
  101.     hWndTrace = CreateWindow("LISTBOX",
  102.         NULL,
  103.         WS_BORDER | WS_CHILD | WS_VSCROLL | WS_VISIBLE,
  104.         rRectangle.left, rRectangle.top, rRectangle.right, rRectangle.bottom,
  105.         hWndMenu, NULL, hInstance, NULL);
  106.  
  107.     sprintf(cTitle, "%s %s", "sKulpt D3D - 1999-2000 Stéphane Guillard - Build", __TIMESTAMP__);
  108.     SendMessage(hWndMenu, WM_SETTEXT, 0, (LPARAM)cTitle);
  109.  
  110.     ShowWindow(hWndMenu, iShowMode);
  111.     UpdateWindow(hWndMenu);
  112.  
  113.     // A partir d'ici, les traces vTrace() sont possibles
  114.  
  115.     // Enregistrer la classe de fenêtre vue 3D
  116.     vTrace("Enregistrement classe fenêtre vue 3d");
  117.     wcPersp.style         = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
  118.     wcPersp.lpfnWndProc   = (WNDPROC) lrPerspWndProc;
  119.     wcPersp.cbClsExtra    = 0;
  120.     wcPersp.cbWndExtra    = 0;
  121.     wcPersp.hInstance     = hInstance;
  122.     wcPersp.hIcon         = NULL;
  123.     wcPersp.hCursor       = LoadCursor(NULL, IDC_ARROW);
  124.     wcPersp.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  125.     wcPersp.lpszMenuName  = NULL;
  126.     wcPersp.lpszClassName = sPersp;
  127.     RegisterClass(&wcPersp);
  128.  
  129.     // Créer la fenêtre vue 3D
  130.     vTrace("Création fenêtre vue 3d");
  131.     hWndPersp = CreateWindowEx(WS_EX_TOOLWINDOW, sPersp, NULL, WS_OVERLAPPEDWINDOW,
  132.               iScreenWidth/2, iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
  133.               hWndMenu, NULL, hInstance, NULL);
  134.     if (!hWndPersp) return (FALSE);
  135.  
  136. #ifndef NO3D 
  137.     
  138.     vTrace("Attachement DirectDraw 7...");
  139.     hrPreInitD3D();
  140.  
  141.     vTrace("Pré-scan des devices D3D disponibles...");
  142.     D3DEnum_EnumerateDevices(NULL);
  143.  
  144.     vTrace("Pré-sélection du device D3D le plus performant...");
  145.     D3DEnum_SelectDefaultDevice(&m_pDeviceInfo);
  146.  
  147.     vTrace("Device pré-sélectionné : %s", m_pDeviceInfo -> strDesc);
  148.  
  149.     do
  150.     {
  151.         vTrace("Dialog sélection device...");
  152.         D3DEnum_UserChangeDevice(&m_pDeviceInfo);
  153.         vTrace("Device sélectionné : %s", m_pDeviceInfo -> strDesc);
  154.  
  155.         // Initialisation Direct3D (DirectX 7) en mode fenêtré
  156.         vTrace("Initialisation D3D7 sur device choisi...");
  157.         hResult = hrInitD3D(hWndPersp, m_pDeviceInfo->pDeviceGUID);// IID_IDirect3DTnLHalDevice);
  158.         
  159.         if (FAILED(hResult)) hrCloseD3D(FALSE);
  160.     }
  161.     while (FAILED(hResult));
  162.     
  163.     sprintf(cTitle, "%s(%s)", XDC_S_Title3D, m_pDeviceInfo->strDesc);
  164.  
  165. #else
  166.     sprintf(cTitle, "3D désactivée dans cette configuration");
  167. #endif
  168.  
  169.     // Mettre à jour le titre de la fenêtre 3D et l'afficher
  170.     SendMessage(hWndPersp, WM_SETTEXT, 0, (LPARAM)cTitle);
  171.     ShowWindow(hWndPersp, iShowMode);
  172.     UpdateWindow(hWndPersp);
  173.  
  174. #ifndef NO3D
  175.     // Initialiser l'environnement 3D
  176.     vTrace("Initialisation environnement applicatif 3D");
  177.     if (FAILED(hResult = hrInitWorld(lpd3dDevice)))
  178.     {
  179.        hrCloseD3D(TRUE);
  180.        return FALSE;
  181.     }
  182. #endif
  183.  
  184.     // Initialisation librairie tools D3D
  185.     if(FAILED(D3DXInitialize()))
  186.         return FALSE;
  187.  
  188.     // Forcer le rafraichissement complet de la fenêtre 3D
  189.     vForce3DRefresh(XDC_MODE_COMPLET);
  190.  
  191.     // Enregistrer la classe de fenêtre vue 2D
  192.     vTrace("Enregistrement classe fenêtre vue 2d");
  193.     wcPlanar.style         = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE | CS_DBLCLKS;
  194.     wcPlanar.lpfnWndProc   = (WNDPROC) lrPlanarWndProc;
  195.     wcPlanar.cbClsExtra    = 0;
  196.     wcPlanar.cbWndExtra    = sizeof(WinThings *);
  197.     wcPlanar.hInstance     = hInstance;
  198.     wcPlanar.hIcon         = NULL;
  199.     wcPlanar.hCursor       = LoadCursor(NULL, IDC_ARROW);
  200.     wcPlanar.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  201.     wcPlanar.lpszMenuName  = NULL;
  202.     wcPlanar.lpszClassName = sPlanar;
  203.     RegisterClass(&wcPlanar);
  204.  
  205.     vTrace("Création fenêtre 2D : vue dessus");
  206.     hWndTop = CreateWindowEx(WS_EX_TOOLWINDOW, sPlanar, "Vue de dessus", WS_OVERLAPPEDWINDOW,
  207.               0, iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
  208.               hWndMenu, NULL, hInstance, NULL);
  209.     if (!hWndTop) return (FALSE);
  210.     SetWindowLong(hWndTop, GWL_USERDATA, XDC_WID_TOP);
  211.     ShowWindow(hWndTop, iShowMode);
  212.     UpdateWindow(hWndTop);
  213.  
  214.     vTrace("Création fenêtre 2D : vue face");
  215.     hWndFace = CreateWindowEx(WS_EX_TOOLWINDOW, sPlanar, "Vue de face", WS_OVERLAPPEDWINDOW,
  216.               0, 5 * iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
  217.               hWndMenu, NULL, hInstance, NULL);
  218.     if (!hWndFace) return (FALSE);
  219.     SetWindowLong(hWndFace, GWL_USERDATA, XDC_WID_FACE);
  220.     ShowWindow(hWndFace, iShowMode);
  221.     UpdateWindow(hWndFace);
  222.  
  223.     vTrace("Création fenêtre 2D : vue droite");
  224.     hWndRight = CreateWindowEx(WS_EX_TOOLWINDOW, sPlanar, "Vue de droite", WS_OVERLAPPEDWINDOW,
  225.               iScreenWidth/2, 5 * iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
  226.               hWndMenu, NULL, hInstance, NULL);
  227.     if (!hWndRight) return (FALSE);
  228.     SetWindowLong(hWndRight, GWL_USERDATA, XDC_WID_SIDE);
  229.     ShowWindow(hWndRight, iShowMode);
  230.     UpdateWindow(hWndRight);
  231.  
  232.     FSInit();
  233.  
  234.     // Afficher l'AboutBox
  235.     vLogo();
  236.  
  237.     // A partir de maintenant il est possible de dessiner dans la fenêtre 3D
  238.     bReady = TRUE;
  239.  
  240.     // Mettre à jour les checkmarks des menus
  241.     vUpdateMenu();
  242.  
  243.     // Traiter les messages windows jusqu'à réception d'un QuitMessage
  244.     vTrace("Entrée dans la boucle de traitement événements");
  245.     while (GetMessage(&hMessage, NULL, 0, 0))
  246.     {
  247.         TranslateMessage(&hMessage);
  248.         DispatchMessage(&hMessage);
  249.     }
  250.  
  251. #ifndef NO3D
  252.     // Fermer Direct3D
  253.     hrCloseD3D(TRUE);
  254. #endif
  255.  
  256.     // Détruire les gadgets Sculpt 3D
  257.     vEraseGadgets();
  258.  
  259.     // Libérer les classes de fenêtres
  260.     UnregisterClass(sPlanar, hInst);
  261.     UnregisterClass(sPersp, hInst);
  262.     UnregisterClass(sMenu, hInst);
  263.  
  264.     FSClose();
  265.  
  266.     return (hMessage.wParam);
  267. }
  268. */
  269.  
  270. // Sortir une trace formattée dans la listbox de la fenêtre trace
  271. void vTrace(LPSTR fmt, ... )
  272. {
  273.     char cBuffer[256];
  274.     va_list args;
  275.  
  276.     // Formatter la trace
  277.     va_start(args, fmt);
  278.     vsprintf(cBuffer, fmt, args);
  279.     va_end(args);
  280.  
  281.     strcat(cBuffer, "\n");
  282.  
  283. #ifndef _AMIGA_
  284.     // Envoyer la trace à la listbox
  285.     LRESULT lRes = SendMessage(hWndTrace, LB_ADDSTRING, 0, (LPARAM) (LPCSTR) cBuffer);
  286.  
  287.     // Si plus de place alors resetter la listbox
  288.     if (lRes == LB_ERRSPACE)
  289.     {
  290.         SendMessage(hWndTrace, LB_RESETCONTENT, 0, 0L);
  291.         lRes = SendMessage(hWndTrace, LB_ADDSTRING, 0, (LPARAM) (LPCSTR) cBuffer);
  292.     }
  293.     
  294.     // Mettre le curseur de la listbox sur la trace
  295.     SendMessage(hWndTrace, LB_SETTOPINDEX, (WPARAM)lRes, 0L);
  296. #else
  297.     if (bConsoleOpened)
  298.         ConPutS(cBuffer);
  299.     else
  300.         printf(cBuffer);
  301. #endif
  302. }
  303.  
  304. /*
  305. // Préparer les hdc de sgadgets sculpt 3D
  306. void vPrepareGadgets(void)
  307. {
  308.     HDC hdcWork = GetDC(hWndTop);
  309.  
  310.     gAddPoint.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ADD_POINT));
  311.     gCenter.hbm        = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CENTER));
  312.     gGoDown.hbm        = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_DOWN));
  313.     gGoLeft.hbm        = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_LEFT));
  314.     gGoUp.hbm        = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_UP));
  315.     gGoRight.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_RIGHT));
  316.     gGrab.hbm        = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GRAB));
  317.     gMakeTri.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MAKE_TRI));
  318.     gReverse.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_REVERSE));
  319.     gRotAnti.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ROT_ANTI));
  320.     gRotClock.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ROT_CLOCK));
  321.     gZoomIn.hbm        = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ZOOM_IN));
  322.     gZoomOut.hbm    = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ZOOM_OUT));
  323.  
  324.     gAddPoint.hdc    = CreateCompatibleDC(hdcWork);
  325.     gCenter.hdc        = CreateCompatibleDC(hdcWork);
  326.     gGoDown.hdc        = CreateCompatibleDC(hdcWork);
  327.     gGoLeft.hdc        = CreateCompatibleDC(hdcWork);
  328.     gGoUp.hdc        = CreateCompatibleDC(hdcWork);
  329.     gGoRight.hdc    = CreateCompatibleDC(hdcWork);
  330.     gGrab.hdc        = CreateCompatibleDC(hdcWork);
  331.     gMakeTri.hdc    = CreateCompatibleDC(hdcWork);
  332.     gReverse.hdc    = CreateCompatibleDC(hdcWork);
  333.     gRotAnti.hdc    = CreateCompatibleDC(hdcWork);
  334.     gRotClock.hdc    = CreateCompatibleDC(hdcWork);
  335.     gZoomIn.hdc        = CreateCompatibleDC(hdcWork);
  336.     gZoomOut.hdc    = CreateCompatibleDC(hdcWork);
  337.  
  338.     gAddPoint.hold    = SelectObject(gAddPoint.hdc, gAddPoint.hbm);
  339.     gCenter.hold    = SelectObject(gCenter.hdc, gCenter.hbm);
  340.     gGoDown.hold    = SelectObject(gGoDown.hdc, gGoDown.hbm);
  341.     gGoLeft.hold    = SelectObject(gGoLeft.hdc, gGoLeft.hbm);
  342.     gGoUp.hold        = SelectObject(gGoUp.hdc, gGoUp.hbm);
  343.     gGoRight.hold    = SelectObject(gGoRight.hdc, gGoRight.hbm);
  344.     gGrab.hold        = SelectObject(gGrab.hdc, gGrab.hbm);
  345.     gMakeTri.hold    = SelectObject(gMakeTri.hdc, gMakeTri.hbm);
  346.     gReverse.hold    = SelectObject(gReverse.hdc, gReverse.hbm);
  347.     gRotAnti.hold    = SelectObject(gRotAnti.hdc, gRotAnti.hbm);
  348.     gRotClock.hold    = SelectObject(gRotClock.hdc, gRotClock.hbm);
  349.     gZoomIn.hold    = SelectObject(gZoomIn.hdc, gZoomIn.hbm);
  350.     gZoomOut.hold    = SelectObject(gZoomOut.hdc, gZoomOut.hbm);
  351.  
  352.     ReleaseDC(hWndTop, hdcWork);
  353. }
  354.  
  355. // Dépréparer les hdc des gadgets sculpt 3D
  356. void vEraseGadgets(void)
  357. {
  358.     SelectObject(gAddPoint.hdc, gAddPoint.hold);
  359.     SelectObject(gCenter.hdc, gCenter.hold);
  360.     SelectObject(gGoDown.hdc, gGoDown.hold);
  361.     SelectObject(gGoLeft.hdc, gGoLeft.hold);
  362.     SelectObject(gGoUp.hdc, gGoUp.hold);
  363.     SelectObject(gGoRight.hdc, gGoRight.hold);
  364.     SelectObject(gGrab.hdc, gGrab.hold);
  365.     SelectObject(gMakeTri.hdc, gMakeTri.hold);
  366.     SelectObject(gReverse.hdc, gReverse.hold);
  367.     SelectObject(gRotAnti.hdc, gRotAnti.hold);
  368.     SelectObject(gRotClock.hdc, gRotClock.hold);
  369.     SelectObject(gZoomIn.hdc, gZoomIn.hold);
  370.     SelectObject(gZoomOut.hdc, gZoomOut.hold);
  371.  
  372.     DeleteObject(gAddPoint.hbm);
  373.     DeleteObject(gCenter.hbm);
  374.     DeleteObject(gGoDown.hbm);
  375.     DeleteObject(gGoLeft.hbm);
  376.     DeleteObject(gGoUp.hbm);
  377.     DeleteObject(gGoRight.hbm);
  378.     DeleteObject(gGrab.hbm);
  379.     DeleteObject(gMakeTri.hbm);
  380.     DeleteObject(gReverse.hbm);
  381.     DeleteObject(gRotAnti.hbm);
  382.     DeleteObject(gRotClock.hbm);
  383.     DeleteObject(gZoomIn.hbm);
  384.     DeleteObject(gZoomOut.hbm);
  385.  
  386.     DeleteDC(gAddPoint.hdc);
  387.     DeleteDC(gCenter.hdc);
  388.     DeleteDC(gGoDown.hdc);
  389.     DeleteDC(gGoLeft.hdc);
  390.     DeleteDC(gGoUp.hdc);
  391.     DeleteDC(gGoRight.hdc);
  392.     DeleteDC(gGrab.hdc);
  393.     DeleteDC(gMakeTri.hdc);
  394.     DeleteDC(gReverse.hdc);
  395.     DeleteDC(gRotAnti.hdc);
  396.     DeleteDC(gRotClock.hdc);
  397.     DeleteDC(gZoomIn.hdc);
  398.     DeleteDC(gZoomOut.hdc);
  399. }
  400. */
  401.